/*******************************************************************************
 * Copyright (c) 2006, 2015 Wind River Systems and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Wind River Systems - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.examples.dsf.filebrowser;

import org.eclipse.debug.internal.ui.viewers.model.provisional.IPresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext;
import org.eclipse.debug.internal.ui.viewers.model.provisional.TreeModelViewer;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

/**
 * File Browser example dialog.  It hold a tree viewer that displays 
 * file system contents and a text box for entering a file path to be
 * shown in the tree. 
 */
@SuppressWarnings("restriction")
public class FileBrowserDialog extends Dialog {

    /**
     * Tree viewer for showing the filesystem contents.
     */
    private TreeModelViewer fViewer;

    /**
     * The model adapter for the tree viewer. 
     */
    private FileBrowserModelAdapter fModelAdapter;
    
    /**
     * Flag used to disable text-box changed events, when the text
     * box is updated due to selection change in tree.
     */
    private boolean fDisableTextChangeNotifications = false;
    
    public FileBrowserDialog(Shell parent) {
        super(parent);
        setShellStyle(getShellStyle() | SWT.RESIZE);        
    }    

    @Override
    protected Control createDialogArea(Composite parent) {
        Composite area = (Composite) super.createDialogArea(parent);
        IPresentationContext presentationContext = new PresentationContext("org.eclipse.cdt.examples.dsf.filebrowser");  //$NON-NLS-1$
        
        fViewer = new TreeModelViewer(area, SWT.VIRTUAL, presentationContext);
        fViewer.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
        
        fModelAdapter = new FileBrowserModelAdapter(presentationContext);
        fViewer.setInput(fModelAdapter.getVMProvider().getViewerInputObject());

        final Text text = new Text(area, SWT.SINGLE | SWT.BORDER);
        text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        
        fViewer.addSelectionChangedListener(new ISelectionChangedListener() {
            @Override
	    public void selectionChanged(SelectionChangedEvent event) {
                /*
                 * Update the file name in the text control, to match the 
                 * selection in the tree.  Do this only if the user is not
                 * actively typing in the text field (test if text has focus).
                 */
                if (!text.isFocusControl() &&
                    event.getSelection() instanceof IStructuredSelection &&
                    ((IStructuredSelection)event.getSelection()).getFirstElement() instanceof FileVMContext)
                {
                    FileVMContext fileVmc = (FileVMContext)((IStructuredSelection)event.getSelection()).getFirstElement();
                    
                    fDisableTextChangeNotifications = true;
                    text.setText(fileVmc.getFile().getAbsolutePath());
                    fDisableTextChangeNotifications = false;
                }
            }
        });
        
        text.addModifyListener(new ModifyListener() {
            @Override
	    public void modifyText(ModifyEvent e) {
                if (!fDisableTextChangeNotifications) {
                    fModelAdapter.getVMProvider().selectionTextChanged(text.getText());
                }
            }
        });
        
        return area;
    }
    
    @Override
    public boolean close() {
        if (super.close()) {
            fModelAdapter.dispose();
            fModelAdapter = null;
            return true;
        }
        return false;
    }

}
